package Ecras;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;

import Controladores.CtlComentariosEAvaliacoes;
import Controladores.CtlPermissoes;
import Controladores.NecessitaSerProprietario;
import Utilities.EstabelecimentoCombo;
import Utilities.PratoCombo;
import Utilities.Utilizador;

public class EcraComentariosEAvaliacoes {

	private CtlComentariosEAvaliacoes ctlComentariosEAvaliacoes;
	private CtlPermissoes ctlPermissoes;
	private JFrame frame;
	private JTextField text_colocado_por;
	private JTextField text_em;
	private JTextField text_as;
	private JTextField text_avaliacao;
	private JTextArea textArea;
	private JComboBox<String> selecionarEstabelecimento;
	private JComboBox<String> selecionarPrato;
	private ArrayList<EstabelecimentoCombo> estabelecimentos = new ArrayList<EstabelecimentoCombo>();
	private ArrayList<PratoCombo> pratos = new ArrayList<PratoCombo>();
	private Utilizador utilizador;
	private String nome;

	public EcraComentariosEAvaliacoes(final Integer idEstabelecimento,
			final Integer idPrato, Utilizador utilizador, String nome,
			final String estabelecimento, final String prato,
			final String avaliacao, final String comentario) {

		this.utilizador = utilizador;
		this.nome = nome;
		frame = new JFrame("Comentario e Avaliacao");
		frame.setBounds(100, 100, 611, 398);
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		frame.getContentPane().setLayout(null);

		ctlPermissoes = CtlPermissoes.getInstance();
		JLabel lblColocadoPor = new JLabel("Colocado por:");
		lblColocadoPor.setBounds(10, 14, 90, 14);
		frame.getContentPane().add(lblColocadoPor);

		text_colocado_por = new JTextField();
		text_colocado_por.setEditable(false);
		text_colocado_por.setBounds(88, 11, 101, 20);
		if (nome != null) {
			text_colocado_por.setText(nome);
		}
		frame.getContentPane().add(text_colocado_por);
		text_colocado_por.setColumns(10);

		JLabel lblData = new JLabel("Em:");
		lblData.setBounds(242, 14, 46, 14);
		frame.getContentPane().add(lblData);

		text_em = new JTextField();
		text_em.setEditable(false);
		text_em.setBounds(298, 11, 86, 20);
		frame.getContentPane().add(text_em);
		text_em.setColumns(10);

		JLabel lblHora = new JLabel("as:");
		lblHora.setBounds(443, 17, 46, 14);
		frame.getContentPane().add(lblHora);

		text_as = new JTextField();
		text_as.setEditable(false);
		text_as.setColumns(10);
		text_as.setBounds(499, 14, 86, 20);
		frame.getContentPane().add(text_as);

		textArea = new JTextArea("Comentario:");
		textArea.setColumns(10);
		textArea.setBounds(23, 74, 448, 207);
		textArea.setLineWrap(true);
		textArea.setWrapStyleWord(true);
		JScrollPane scrollPane = new JScrollPane(textArea);
		scrollPane.setBounds(20, 89, 565, 175);
		scrollPane
				.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		if (comentario != null) {
			textArea.setText(comentario);
		}
		frame.getContentPane().add(scrollPane);
		if (nome == null) {

			setNome(ctlPermissoes.getNomeUtilizador(getUtilizador().getEmail()));
		}

		JButton button_alteracoes = new JButton("Gravar Alteracoes");
		button_alteracoes.setBounds(164, 322, 141, 31);
		frame.getContentPane().add(button_alteracoes);
		button_alteracoes.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println(getNome());
				try {
					ctlPermissoes.verificarPermissoes(getUtilizador()
							.getEmail(), getNome());
				} catch (NecessitaSerProprietario e1) {
					JOptionPane.showMessageDialog(null,
							"Nao tens permissao para alterar o comentario");
					
				}
				
					System.out.println(idEstabelecimento);
					boolean confirmAlteration = ctlComentariosEAvaliacoes
							.gravarAlteracao(idEstabelecimento, idPrato,
									textArea.getText(), text_avaliacao
											.getText(), getUtilizador()
											.getEmail());
					if (confirmAlteration)
						JOptionPane.showMessageDialog(null,
								"Alteracao efetuada com sucesso");

			}

		});

		JButton button_apagar = new JButton("Apagar");
		button_apagar.setBounds(327, 322, 124, 31);
		frame.getContentPane().add(button_apagar);
		button_apagar.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				try {
					ctlPermissoes.verificarPermissoes(getUtilizador().getEmail(),
							getNome());
				} catch (NecessitaSerProprietario e1) {
				JOptionPane.showMessageDialog(null, "Nao tem permissao para apagar o comentario");
				}

				boolean confirmDelete = ctlComentariosEAvaliacoes
						.apagarComentario(idEstabelecimento, idPrato,
								getUtilizador().getEmail());
				if (confirmDelete)
					JOptionPane.showMessageDialog(null,
							"Comentario eliminado com Sucesso");
			}
		});

		JLabel lblAvaliacao = new JLabel("Avaliacao");
		lblAvaliacao.setBounds(412, 282, 61, 14);
		frame.getContentPane().add(lblAvaliacao);

		JLabel lblEstabelecimentos = new JLabel("Estabelecimento");
		lblEstabelecimentos.setBounds(10, 61, 124, 14);
		frame.getContentPane().add(lblEstabelecimentos);

		selecionarEstabelecimento = new JComboBox<String>();
		selecionarEstabelecimento.setBounds(114, 58, 215, 20);
		frame.getContentPane().add(selecionarEstabelecimento);

		JButton criarComentario = new JButton("Criar Comentario");
		criarComentario.setBounds(20, 322, 134, 31);
		frame.getContentPane().add(criarComentario);
		criarComentario.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {

				boolean confirm = ctlComentariosEAvaliacoes.inserir(
						getUtilizador().getEmail(),
						getIdEstabelecimento(selecionarEstabelecimento
								.getSelectedItem()), getIdPrato(selecionarPrato
								.getSelectedItem()), textArea.getText(),
						text_avaliacao.getText(), selecionarPrato
								.getSelectedItem());

				if (confirm
						&& (selecionarEstabelecimento.getSelectedItem() != null || !selecionarPrato
								.getSelectedItem().equals(""))) {
					JOptionPane.showMessageDialog(null,
							"Comentario ao prato inserido com sucesso");
				} else if (confirm
						&& selecionarPrato.getSelectedItem().equals("")) {
					JOptionPane
							.showMessageDialog(null,
									"Comentario ao estabelecimento inserido com sucesso");

				}
			}

		});

		JLabel lblPratos = new JLabel("Prato");
		lblPratos.setBounds(338, 61, 46, 14);
		frame.getContentPane().add(lblPratos);

		selecionarPrato = new JComboBox<String>();
		selecionarPrato.setBounds(394, 58, 191, 20);
		frame.getContentPane().add(selecionarPrato);

		text_avaliacao = new JTextField("0");
		text_avaliacao.setColumns(10);
		text_avaliacao.setBounds(484, 279, 101, 20);
		if (avaliacao != null) {
			text_avaliacao.setText(avaliacao);
		}
		frame.getContentPane().add(text_avaliacao);

		JButton button_sair = new JButton("Sair");
		button_sair.setBounds(461, 322, 124, 31);
		frame.getContentPane().add(button_sair);
		button_sair.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				frame.dispose();
			}
		});

		ctlComentariosEAvaliacoes = new CtlComentariosEAvaliacoes(this,
				estabelecimento);
		if (prato != null) {
			ctlComentariosEAvaliacoes.getPratos(estabelecimento, prato);
			selecionarPrato.setSelectedItem(prato);
		}

		selecionarEstabelecimento.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				pratos.clear();
				selecionarPrato.removeAllItems();

				ctlComentariosEAvaliacoes.getPratos(
						selecionarEstabelecimento.getSelectedItem(), prato);
				Integer id = null;
				for (EstabelecimentoCombo ec : estabelecimentos) {
					if (selecionarEstabelecimento.getSelectedItem().equals(
							ec.getLabel()))
						id = ec.getId();
				}
				textArea.setText(ctlComentariosEAvaliacoes
						.getComentarioAoEstabelecimento(getUtilizador()
								.getEmail(), id));
			}
		});
		selecionarPrato.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				Integer id = null;
				for (PratoCombo pc : pratos) {
					if (selecionarPrato.getSelectedItem().equals(pc.getLabel()))
						id = pc.getId();
				}
				textArea.setText(ctlComentariosEAvaliacoes
						.getComentarioAoPrato(getUtilizador().getEmail(), id));

			}
		});

		frame.setVisible(true);
	}

	public void displayPratos(ArrayList<PratoCombo> pratos,
			String pratoEcraAnterior) {
		this.pratos.clear();
		this.pratos = pratos;
		selecionarPrato.addItem("");
		for (PratoCombo prato : pratos) {
			selecionarPrato.addItem(prato.getLabel());
		}
	}

	public void displayEstabelecimentos(
			ArrayList<EstabelecimentoCombo> estabelecimentos,
			String estabelecimentoEcraAnterior) {
		this.estabelecimentos.clear();
		this.estabelecimentos = estabelecimentos;
		selecionarEstabelecimento.addItem("");
		for (EstabelecimentoCombo estabelecimento : estabelecimentos) {
			selecionarEstabelecimento.addItem(estabelecimento.getLabel());
		}
		if (estabelecimentoEcraAnterior != null) {
			selecionarEstabelecimento
					.setSelectedItem(estabelecimentoEcraAnterior);
		}
	}

	public ArrayList<PratoCombo> getArrayListPratos() {
		return pratos;
	}

	public Utilizador getUtilizador() {
		return utilizador;
	}

	private String getNome() {
		return nome;
	}

	private String setNome(String nome) {
		return this.nome = nome;
	}

	private Integer getIdPrato(Object prato) {
		if (prato != null) {
			for (PratoCombo pc : pratos) {
				if (pc.getLabel().equals(prato))
					return pc.getId();
			}
		}
		return null;

	}

	private Integer getIdEstabelecimento(Object estabelecimento) {
		if (estabelecimento != null) {
			for (EstabelecimentoCombo ec : estabelecimentos) {
				if (estabelecimento.equals(ec.getLabel())) {
					return ec.getId();
				}
			}
		}
		return null;

	}
}
